home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
imelo
/
cmscc
/
f502i.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-06
|
2KB
|
108 lines
/*
F502用MML変換
*/
#include <stdio.h>
/*
入力されるプリプロセス例:
O5C+4O5C+4O5G0HO5G08O5G+4O5A+4O5G02 O5F04O5F04O5E04O5E04O5D04O5D04O5C02
O5C04O5C04O5G04O5G04O5A04O5A04O5G02 O5F04O5F04O5E04O5E04O5D04O5D04O5C02
O5G04O5G04O5F04O5F04O5E04O5E04O5D02 O5G04O5G04O5F04O5F04O5E04O5E04O5D02
O5C04O5C04O5G04O5G04O5A04O5A04O5G02 O5F04O5F04O5E04O5E04O5D04O5D04O5C02
一応、
On?fl
|||+-音長('1','2','3','4','6','8',16='H')
||+--#フラグ('+'or'0'なし)
|+---音名('C','D','E','F','G','A','B'or'R')
+----オクターブ('3','4','5')
が保証
*/
int CMSCC_conv23_F502i(src,dest,err)
unsigned char *src,*dest,*err;
{
unsigned char *s,*d,*e,*k;
unsigned char oct, //オクターブ
name, //音名
sharp, //#
len; //音長
unsigned char skip, //スキップコード
p; //実際に押すボタン
s=src;
d=dest; *d=NULL;
e=err;
k=err; //@@暫定
while( *s ){
/* 読み込み
*/
skip=0;
switch( *s ){
case 'O':
s++;
oct=*s++;
name=*s++;
sharp=*s++;
len=*s++;
break;
case ' ': case 0x0d: case 0x0a: case '\t':
skip=*s++;
break;
}
/* 書きだし
*/
if( skip==0 ){
switch(name){
case 'C': p='1'; break;
case 'D': p='2'; break;
case 'E': p='3'; break;
case 'F': p='4'; break;
case 'G': p='5'; break;
case 'A': p='6'; break;
case 'B': p='7'; break;
case 'R': p='0'; break;
}
if( name!='R' ){
switch(oct){
case '3': *d++=p;*d++=p;*d++=p; break;
case '4': *d++=p; break;
case '5': *d++=p;*d++=p; break;
}
}
else{
*d++=p; //休符を続けて押すと長さが変わるので、要特別扱い
}
switch(sharp){ //if()でもいいけど気分の問題
case '+': p='@'; *d++=p; break;
}
switch(len){
case '1': p='9'; *d++=p;*d++=p; break;
case 'H': p='9'; *d++=p; break;
case '8': break; //デフォルト
case '6': p='8'; *d++=p; break;
case '4': p='8'; *d++=p;*d++=p; break;
case '3': p='8'; *d++=p;*d++=p;*d++=p; break;
case '2': p='8'; *d++=p;*d++=p;*d++=p;*d++=p; break;
}
*d++='>'; //次の文字へマーク
}
else{
//*d++=skip;
}
}
*d++=NULL;
}